package br.urca.controller;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.urca.dao.AproveitamentoDAO;
import br.urca.dao.DisciplinaDAO;
import br.urca.dao.DisciplinasCursadasDAO;
import br.urca.dao.HistoricoDAO;
import br.urca.dao.OfertaDAO;
import br.urca.dao.SituacaoDisciplinaDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.model.Aproveitamento;
import br.urca.model.Disciplina;
import br.urca.model.DisciplinaCursada;
import br.urca.model.Historico;
import br.urca.model.HistoricoDisciplina;
import br.urca.model.Oferta;
import br.urca.session.UsuarioLogado;

@Controller
@InterceptResource
public class DisciplinasCursadasController {

	private DisciplinasCursadasDAO mMatriculasHistDAO;
	private AproveitamentoDAO mAproveitamentoDAO;
	private HistoricoDAO mHistoricoDAO;
	private DisciplinaDAO mDisciplinaDAO;
	private OfertaDAO mOfertaDAO;
	private Result result;
	private UsuarioLogado mUsuarioLogado;	
	private SituacaoDisciplinaDAO mSituacaoDiscDAO;
	
	public DisciplinasCursadasController() { }
	
	@Inject
	public DisciplinasCursadasController(DisciplinasCursadasDAO mDAO,
			HistoricoDAO mHistoricoDAO, DisciplinaDAO mDisciplinaDAO,
			UsuarioLogado mUsuarioLogado, OfertaDAO mOfertaDAO,
			SituacaoDisciplinaDAO mSituacaoDiscDAO,
			AproveitamentoDAO mAproveitamentoDAO, Result result) {
		this.mUsuarioLogado = mUsuarioLogado;
		this.mDisciplinaDAO = mDisciplinaDAO;
		this.mOfertaDAO = mOfertaDAO;
		this.mMatriculasHistDAO = mDAO;
		this.mAproveitamentoDAO = mAproveitamentoDAO;
		this.mHistoricoDAO = mHistoricoDAO;
		this.mSituacaoDiscDAO = mSituacaoDiscDAO;
		this.result = result;
	}
	
	@Path("/cursadas")
	public void index() {
		
		List<DisciplinaCursada> mListMatriculasHist = mMatriculasHistDAO.buscarPorMatricula(mUsuarioLogado.getAluno().getMatricula());
		List<Aproveitamento> mListAproveitamentos = mAproveitamentoDAO.getDiscParaHistorico(mUsuarioLogado.getAluno().getMatricula());
		List<Historico> mListHistorico = mHistoricoDAO.getDiscParaHistorico(mUsuarioLogado.getAluno().getMatricula());
		
		this.result.include("aluno",
				mUsuarioLogado.getAluno().getAluno().getNome())
				.include("matricula", mUsuarioLogado.getAluno().getMatricula());
		
		buscarListaOfertasCursadas(mListMatriculasHist, mListAproveitamentos, mListHistorico);
	}
	
	public void buscarListaOfertasCursadas(
			List<DisciplinaCursada> mListMatriculasHist,
			List<Aproveitamento> mListAproveitamentos,
			List<Historico> mListHistorico) {
		
		String oferta = "";
		
		List<String> listOferta = new ArrayList<String>();
		if (mListMatriculasHist != null) {
			for (DisciplinaCursada dc : mListMatriculasHist) {
				if (!listOferta.contains(dc.getId().getCodOferta().trim())) {
					oferta = dc.getId().getCodOferta().trim();
					listOferta.add(oferta);
				}
			}
		}
		if (mListAproveitamentos != null) {
			for (Aproveitamento ap : mListAproveitamentos) {
				if (!listOferta.contains(ap.getOferta().trim())) {
					oferta = ap.getOferta().trim();
					listOferta.add(oferta);
				}
			}
		}
		if (mListHistorico != null) {
			for (Historico ht: mListHistorico) {
				if (!listOferta.contains(ht.getId().getOferta().trim())) {
					oferta = ht.getId().getOferta().trim();
					listOferta.add(oferta);
				}
			}
		}
		this.result.include("periodos", listOferta);
	}
	
	public void buscar(String oferta) {
		
		String matricula = mUsuarioLogado.getAluno().getMatricula();
			
		if (oferta != null && matricula != null) {
			try { 
				Integer.parseInt(oferta);
				
				List<HistoricoDisciplina> mListDisciplinas = null;
				if (mListDisciplinas == null) { 
					mListDisciplinas = new ArrayList<HistoricoDisciplina>();
				}
				
				HistoricoDisciplina hd;
				
				List<DisciplinaCursada> mListMatriculasHist = this.mMatriculasHistDAO.buscarPorCodOferta(oferta, matricula);
				List<Aproveitamento> mListAproveitamentos = this.mAproveitamentoDAO.getDiscParaHistoricoPorOferta(oferta, matricula);
				List<Historico> mListHistorico = this.mHistoricoDAO.getDiscParaHistoricoPorOferta(oferta, matricula);
				
				if (mListMatriculasHist != null) {
					for(DisciplinaCursada d: mListMatriculasHist) {
							
						Oferta mOferta = null;
						Disciplina mdDisciplina = null;
						
						mOferta = mOfertaDAO.buscarPorOfertaPedido(
								d.getId().getCodOferta(), d.getId().getCodPedido());
						if (mOferta != null)
							mdDisciplina = mDisciplinaDAO.buscarPorId(
									mOferta.getCodDisciplina());
						if (mOferta != null) {
							hd = new HistoricoDisciplina();
							
							hd.setCodDisciplina((mOferta != null ? mOferta.getCodDisciplina() : ""));
							hd.setCreditos((mOferta != null ? mOferta.getTotalCreditos() : ""));
							
							hd.setNomeDisciplina(
									(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
							
							hd.setCodOferta(d.getId().getCodOferta());
							hd.setCodPedido(d.getId().getCodPedido());						
							hd.setMedia(d.getMedia());
							hd.setNotaAV1(d.getNotaAV1());
							hd.setNotaAV2(d.getNotaAV2());
							hd.setNotaAVF(d.getNotaAVF());
							hd.setSituacao(d.getSituacao().getDescricao());
							
							mListDisciplinas.add(hd);
						}
						
					}
				}
				
				if (mListAproveitamentos != null && !mListAproveitamentos.isEmpty()) {
					for (Aproveitamento ap: mListAproveitamentos) {
						
						hd = new HistoricoDisciplina();
						Disciplina mDisciplina = null;
						mDisciplina = mDisciplinaDAO.buscarPorId(ap.getId().getCodDisciplina());
						
						hd.setCodDisciplina((ap.getId().getCodDisciplina() != null ? ap.getId().getCodDisciplina() : ""));
						hd.setCreditos(String.valueOf(ap.getTotalCreditos()));
						
						hd.setNomeDisciplina(
								(mDisciplina != null ? mDisciplina.getNomeDisciplina() : "" ));
						
						hd.setCodOferta(ap.getOferta());
						if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
							hd.setSituacao("");					
						} else {
							hd.setSituacao(mSituacaoDiscDAO.getObject(ap.getTipo()).getDescricao());
						}	
						
						mListDisciplinas.add(hd);
					}
				}
				
				if (mListHistorico != null && !mListHistorico.isEmpty()) {
					for (Historico h: mListHistorico) {
						hd = new HistoricoDisciplina();
						Disciplina mDisciplina = null;
						mDisciplina = mDisciplinaDAO.buscarPorId(h.getId().getCodDisciplina());
						hd.setCodDisciplina((h.getId().getCodDisciplina() != null ? h.getId().getCodDisciplina() : ""));
						hd.setCreditos(h.getCreditos().toString());
						hd.setCodOferta(h.getId().getOferta());
						hd.setCodPedido(h.getPedido());
						hd.setNomeDisciplina(
								(mDisciplina != null ? mDisciplina.getNomeDisciplina() : "" ));
						hd.setNotaAV1(h.getNotaAV1());
						hd.setNotaAV2(h.getNotaAV2());
						hd.setNotaAVF(h.getNotaAVF());
						hd.setMedia(h.getNota());
						if (hd.getCodDisciplina().equalsIgnoreCase("99999")) {
							hd.setSituacao("");					
						} else {
							hd.setSituacao(h.getSituacao().getDescricao());
						}	
						
						mListDisciplinas.add(hd);
					}
				}
				
				this.result.include("listaCursadas", 
							mListDisciplinas)
							.include("matricula", matricula)
							.include("codOferta", oferta)
							.include("aluno", mUsuarioLogado.getAluno().getAluno().getNome())
							.redirectTo(this).index();
			} catch(Exception e) {
				this.result.include("mensagem","Matrícula ou oferta inválida!")
					.redirectTo(this).index();
			}
		} else {
			this.result.include("mensagem","Matrícula ou oferta não foi informada!")
				.redirectTo(this).index();
		}
	}
	
}
